<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        // 真正的编程应该从堆栈（内存）分析开始
        // 堆 Heap
        // 栈 Srack

        // ---都是
        // var a = {
        //     n: 10
        // }
        // var b = a;
        // a.x = a = {
        //     n: 20
        // };
        // console.log(a.x);
        // console.log(a)
        // console.log(b);
        // console.log(b.x);
        // console.log(b.n);


        const obj1 = {
            age: 20,
            name: 'xxx',
            address: {
                city: 'beijing'
            },
            arr: ['a', 'b', 'c']
        }

        const obj2 = deepClone(obj1)
        obj2.address.city = 'shanghai'
        obj2.arr[0] = 'a1'
        console.log(obj1.address.city)
        console.log(obj1.arr[0])
        // ————————————————
        // 版权声明：本文为CSDN博主「星空之火@田兴」的原创文章，遵循CC 4.0 BY - SA版权协议，转载请附上原文出处链接及本声明。
        // 原文链接：https://blog.csdn.net/weixin_43638968/article/details/109243067




        function deepClone(obj = {}) {
            if (typeof obj !== 'object' || obj == null) {
                // obj 是 null ，或者不是对象和数组，直接返回
                return obj
            }

            // 初始化返回结果
            let result
            if (obj instanceof Array) {
                result = []
            } else {
                result = {}
            }

            for (let key in obj) {
                // 保证 key 不是原型的属性
                if (obj.hasOwnProperty(key)) {
                    // 递归调用！！！
                    result[key] = deepClone(obj[key])
                }
            }

            // 返回结果
            return result
        }
    </script>
</body>

</html>